/*
 * Copyright 2000-2020 ALPHA LAB.Inc All Rights Reserved.
 */
package com.alphalab.framework.role;
 
import java.io.Serializable;
import java.util.List;
import java.util.Map;  
import com.alphalab.framework.dao.IGeneralQueryDao; 
import com.alphalab.framework.domain.AbstractValueObject;
import com.alphalab.framework.domain.AbstractValueObjectTransfer;
import com.alphalab.framework.domain.BaseEntity;
import com.alphalab.framework.domain.ItemCondition;
import com.alphalab.framework.domain.QueryOption;
import com.alphalab.framework.exception.MoServiceException;
import com.alphalab.framework.types.MoErrorCodeEnum;
import com.alphalab.framework.util.ExplainConditionUtil; 

/**
 * 对数据对象的业务逻辑处理，属于业务逻辑层.
 * 表示由Role来扮演操作数据的角色，主要处理复杂查询.
 * @param <VO> 
 * @param <PO> 
 * @param <DAO> 
 * @param <TRANSFER> 
 * @author allen 
 * @version 1.0.0 2017年8月15日
 */
public class GeneralQueryRole <VO extends AbstractValueObject, PO extends BaseEntity, DAO 
	extends IGeneralQueryDao<PO>, TRANSFER 
		extends AbstractValueObjectTransfer<VO, PO>> implements IGeneralQueryRole<VO> {

	/**
	 * POVO转换器.
	 */
	private TRANSFER entityTransfer;
	/**
	 * generalQueryDao.
	 */
	private DAO generalQueryDao;
	
	/**
	 * 设置transfer.
	 * @param transfer transfer
	 */
	public void setEntityTransfer(final TRANSFER transfer) {
		this.entityTransfer = transfer;
	}

	/**
	 * 获取transfer.
	 * @return TRANSFER
	 */
	public TRANSFER getEntityTransfer() {
		if (this.entityTransfer == null) {
			throw new MoServiceException(MoErrorCodeEnum.ERROR_UNABLE_GET_ENTITY_TRANSFER.getCode(),
					MoErrorCodeEnum.ERROR_UNABLE_GET_ENTITY_TRANSFER.getMsg());
		}
		return this.entityTransfer;
	}
	
	/**
	 * 设置generalQueryDao. 
	 * @param newgeneralQueryDao newgeneralQueryDao
	 */
	public void setGeneralQueryDao(final DAO newgeneralQueryDao) {
		this.generalQueryDao = newgeneralQueryDao;
	}

	/**
	 * 获取generalQueryDao.
	 * @return generalQueryDao
	 */	
	public DAO getGeneralQueryDao() {
		return this.generalQueryDao;
	}

	/**
	 * 根据主键返回对象.
	 * @param id 主键
	 * @return VO
	 */
	@Override
	public VO find(final Serializable id) { 
		return getEntityTransfer().toVO(getGeneralQueryDao().find(id));
	}

	/**
	 * 根据查询条件返回分页结果集.
	 * @param itemConditions 查询条件，为空则表示无条件
	 * @param pageIndex 第几页，从1开始
	 * @param pageSize 每页的记录总数
	 * @param orderBy 排序字段，为空表示默认排序
	 * @param isDesc 是否降序，为true表示降序
	 * @return List<VO>
	 */
	@Override
	public List<VO> findListByPageWithCondition(
			final List<ItemCondition> itemConditions, final int pageIndex, final int pageSize,
			final String orderBy, final boolean isDesc) {  
		final QueryOption queryOption = ExplainConditionUtil.explainConditionOption(itemConditions);
		return getEntityTransfer().toVO(getGeneralQueryDao().findListByPageWithCondition(
				queryOption, pageIndex, pageSize, orderBy, isDesc));
	}

	/**
	 * 根据查询条件返回全部结果集.
	 * @param itemConditions 查询条件，为空则表示无条件
	 * @param orderBy 排序字段，为空表示默认排序
	 * @param isDesc 是否降序，为true表示降序
	 * @return List<VO>
	 */
	@Override
	public List<VO> findListWithCondition(final List<ItemCondition> itemConditions,
			final String orderBy, final boolean isDesc) { 
		final QueryOption queryOption = ExplainConditionUtil.explainConditionOption(itemConditions);
		return getEntityTransfer().toVO(getGeneralQueryDao().findListWithCondition(
				queryOption, orderBy, isDesc));
	}

	/**
	 * 根据hql查询返回全部结果集.
	 * @param hql hql
	 * @param conditions 查询参数键值对集合
	 * @return List<VO>
	 */
	@Override
	public List<VO> findByHql(final String hql, final Map<String, Object> conditions) { 
		return getEntityTransfer().toVO(getGeneralQueryDao().findByHql(hql, conditions));
	}

	/**
	 * 根据hql查询返回分页结果集.
	 * @param hql hql
	 * @param conditions 查询参数键值对集合
	 * @param pageIndex 第几页，从1开始
	 * @param pageSize 每页的记录总数
	 * @return List<VO>
	 */
	@Override
	public List<VO> findByHql(final String hql, final Map<String, Object> conditions,
			final int pageIndex, final int pageSize) { 
		return getEntityTransfer().toVO(getGeneralQueryDao().findByHql(hql, conditions, 
				pageIndex, pageSize));
	}

	/**
	 * 根据原生sql查询返回全部结果集.
	 * @param sql sql
	 * @param conditions 查询参数键值对集合
	 * @return List<Map>
	 */
	@Override
	public List<Map> findBySql(final String sql, final Map<String, Object> conditions) { 
		return getGeneralQueryDao().findBySql(sql, conditions);
	}

	/**
	 * 根据原生sql查询返回分页结果集.
	 * @param sql sql
	 * @param conditions 查询参数键值对集合
	 * @param pageIndex 第几页，从1开始
	 * @param pageSize 每页的记录总数
	 * @return List<Map>
	 */
	@Override
	public List<Map> findBySql(final String sql, final Map<String, Object> conditions, 
			final int pageIndex, final int pageSize) { 
		return getGeneralQueryDao().findBySql(sql, conditions, pageIndex, pageSize);
	}  

}
